const jwt = require('jsonwebtoken');
const { error } = require('../utils/response');
const { User } = require('../models');

const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';

// 不需要认证的路径
const publicPaths = [
    '/auth/login',
    '/auth/register',
    '/auth/forgot-password'
];

// 验证 token 的中间件
const auth = async (req, res, next) => {
    try {
        // 检查是否是公开路径
        if (publicPaths.includes(req.path)) {
            return next();
        }

        // 从请求头获取 token
        const authHeader = req.headers.authorization;
        if (!authHeader) {
            return res.json(error('请先登录', 401));
        }

        const token = authHeader.split(' ')[1];
        if (!token) {
            return res.json(error('无效的认证格式', 401));
        }

        try {
            // 验证 token
            const decoded = jwt.verify(token, JWT_SECRET);
            
            // 检查用户是否存在
            const user = await User.findByPk(decoded.id);
            if (!user) {
                return res.json(error('用户不存在或已被删除', 401));
            }

            // 将用户信息添加到请求对象中
            req.user = {
                id: user.id,
                username: user.username,
                email: user.email,
                role: user.role
            };
            
            next();
        } catch (err) {
            if (err.name === 'TokenExpiredError') {
                return res.json(error('登录已过期，请重新登录', 401));
            }
            if (err.name === 'JsonWebTokenError') {
                return res.json(error('无效的登录凭证', 401));
            }
            throw err;
        }
    } catch (err) {
        console.error('认证失败:', err);
        res.json(error('认证过程发生错误', 500));
    }
};

// 验证管理员权限的中间件
const admin = (req, res, next) => {
    if (!req.user) {
        return res.json(error('请先登录', 401));
    }
    
    if (req.user.role !== 'admin') {
        return res.json(error('需要管理员权限', 403));
    }
    
    next();
};

module.exports = {
    auth,
    admin
}; 